<?php

namespace App\Http\Controllers\Site;

use App\Http\Controllers\Controller;
use App\Models\Cart;
use App\Models\Goods;
use App\Models\Product;
use Illuminate\Http\Request;

class CartController extends Controller
{
    public function __construct()
    {
        //中间件验证
        $this->middleware('user');
    }

    function addCart(Product $product, $num)
    {
//        dd([$goods->id,$product->id,$num]);
//        向购物车表中添加数据,这个时候要分情况
        //情况一:如果当前用户之前没有收藏过这个货品就创建模型
//情况二:如果当前用户之前已经将某个货品加入购物车,这个时候不创建模型而是update更新模型数量
//create 接受普通的 PHP 数组,创建模型并插入到数据库中。
        $price = $product->goods->price + $product['addPrice'];
        //从购物车表中查看当前用户是否已经在购物车中加过这个货品,如果能查到返回cart对象,如果查不多返回null
        $old = Cart::where('user_id', auth()->id())->where('product_id', $product['id'])->first();
        if (is_null($old)) {
            //如果之前没有收藏过就新创建模型对象
            Cart::create([
                'user_id' => auth()->id(),
                'goods_id' => $product['goods_id'],
                'product_id' => $product['id'],
                'num' => $num,
                'price' => $price,
                'sum' => $price * $num,
            ]);
        } else {
            //如果之前收藏过就更新对象中的num和sum属性
            $old->num = $old['num'] + $num;
            $old->price = $price;
            $old->sum = $old['num'] * $price;
            $old->save();
        }
        return back()->with('success', '添加购物车成功');
    }

//    用户购物车页面
    public function cartIndex()
    {
        //在购物车cart模型中写了购物车模型与goods商品模型和product货品模型反向关联的方法,这样就可以在查询的时候使用with()预加载的方式将某个购物车对象对应的商品和货品信息都获取到
        $carts = Cart::with(['goods', 'product'])->get()->toArray();
//        对上面的$carts中的每一条购物车数组中增加一个checked属性,方便前台通过vue自动计算小计
        $carts = array_map(function ($value){
            $value['checked'] = false;
            return $value;
        },$carts);
        return view('site.cart', compact('carts'));
    }

    //写一个用户在购物车页面通过异步修改数量的方法
    public function axiosChangeNum(Product $product, $num)
    {
//        由于product商品id是唯一的,再加上当前用户的id就可以在cart表中唯一确定一条记录,就是要修改的记录
//                dd([$product->id,$num]);
//        通过购物车页面异步请求到这里,说明cart表中一定有旧数据,对之前的旧数据进行修改
        $cart = Cart::where('user_id', auth()->id())->where('product_id', $product['id'])->first();
        //修改cart表中当前用户对应之前那条货品数据表中的num数量和sum小计
        $cart['num'] = $cart['num'] + $num * 1;
        $cart['sum'] = $cart['price']*$cart['num'];
        //调用save()方法保存修改的对象属性,save()方法返回值为true或者false
         $var = $cart->save();
        //给异步请求返回数据
        return ['valid'=>$var,'message'=>'异步请求成功,后台数据修改完成'];
    }
    public function axiosDelCart(Product $product){
        //先从cart表中找到要删除的记录
        //查询构造器也可以使用 delete 方法从数据表中删除记录。
        //如果你需要清空表，你可以使用 truncate 方法，这将删除所有行，并重置自增 ID 为零
        $res = Cart::where('user_id',auth()->id())->where('product_id',$product['id'])->first()->delete();
        return ['valid'=>$res,'message'=>'购物车中数据删除成功'];

    }

}
